]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/perf-helper: Use GApplication
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 13 Apr 2023 14:40:58 +0000 (16:40 +0200)
committerMarge Bot <marge-bot@gnome.org>
Wed, 7 Jun 2023 11:12:40 +0000 (11:12 +0000)
The gtk_main() API is gone in GTK4, so we'll have to either
manage our own loop, or use GApplication. The latter also
handles the D-Bus setup for us, so use that.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2733>

src/shell-perf-helper.c

index addf011e9cc0681821e43bc5748e871acb7c4532..6b2a1d35e3360f765c9399420665ecb31ade3929 100644 (file)
 
 #define BUS_NAME "org.gnome.Shell.PerfHelper"
 
-static void destroy_windows           (void);
-static void finish_wait_windows       (void);
-static void check_finish_wait_windows (void);
-
 static const gchar introspection_xml[] =
          "<node>"
          "  <interface name='org.gnome.Shell.PerfHelper'>"
@@ -57,46 +53,59 @@ static GOptionEntry opt_entries[] =
     { NULL }
   };
 
-static guint timeout_id;
-static GList *our_windows;
-static GList *wait_windows_invocations;
+#define PERF_HELPER_TYPE_APP (perf_helper_app_get_type ())
+G_DECLARE_FINAL_TYPE (PerfHelperApp, perf_helper_app, PERF_HELPER, APP, GtkApplication)
+
+struct _PerfHelperApp {
+  GtkApplication parent;
+
+  guint timeout_id;
+  GList *our_windows;
+  GList *wait_windows_invocations;
+};
+
+G_DEFINE_TYPE (PerfHelperApp, perf_helper_app, GTK_TYPE_APPLICATION);
+
+static void destroy_windows           (PerfHelperApp *app);
+static void finish_wait_windows       (PerfHelperApp *app);
+static void check_finish_wait_windows (PerfHelperApp *app);
 
 static gboolean
 on_timeout (gpointer data)
 {
-  timeout_id = 0;
+  PerfHelperApp *app = data;
+  app->timeout_id = 0;
 
-  destroy_windows ();
-  gtk_main_quit ();
+  destroy_windows (app);
+  g_application_quit (G_APPLICATION (app));
 
   return FALSE;
 }
 
 static void
-establish_timeout (void)
+establish_timeout (PerfHelperApp *app)
 {
-  g_clear_handle_id (&timeout_id, g_source_remove);
+  g_clear_handle_id (&app->timeout_id, g_source_remove);
 
-  timeout_id = g_timeout_add (opt_idle_timeout * 1000, on_timeout, NULL);
-  g_source_set_name_by_id (timeout_id, "[gnome-shell] on_timeout");
+  app->timeout_id = g_timeout_add (opt_idle_timeout * 1000, on_timeout, app);
+  g_source_set_name_by_id (app->timeout_id, "[gnome-shell] on_timeout");
 }
 
 static void
-destroy_windows (void)
+destroy_windows (PerfHelperApp *app)
 {
   GList *l;
 
-  for (l = our_windows; l; l = l->next)
+  for (l = app->our_windows; l; l = l->next)
     {
       WindowInfo *info = l->data;
       gtk_widget_destroy (info->window);
       g_free (info);
     }
 
-  g_list_free (our_windows);
-  our_windows = NULL;
+  g_clear_list (&app->our_windows, NULL);
 
-  check_finish_wait_windows ();
+  check_finish_wait_windows (app);
 }
 
 static gboolean
@@ -119,7 +128,7 @@ on_window_draw (GtkWidget  *window,
   if (info->exposed && info->mapped && info->pending)
     {
       info->pending = FALSE;
-      check_finish_wait_windows ();
+      check_finish_wait_windows (PERF_HELPER_APP (g_application_get_default ()));
     }
 
   return FALSE;
@@ -195,12 +204,13 @@ tick_callback (GtkWidget     *widget,
 }
 
 static void
-create_window (int      width,
-              int      height,
-               gboolean alpha,
-               gboolean maximized,
-               gboolean redraws,
-               gboolean text_input)
+create_window (PerfHelperApp *app,
+               int            width,
+               int            height,
+               gboolean       alpha,
+               gboolean       maximized,
+               gboolean       redraws,
+               gboolean       text_input)
 {
   WindowInfo *info;
   GtkWidget *child;
@@ -208,7 +218,7 @@ create_window (int      width,
   info = g_new0 (WindowInfo, 1);
   info->alpha = alpha;
   info->redraws = redraws;
-  info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  info->window = gtk_application_window_new (GTK_APPLICATION (app));
   if (alpha)
     gtk_widget_set_visual (info->window, gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
   if (maximized)
@@ -240,28 +250,27 @@ create_window (int      width,
     gtk_widget_add_tick_callback (info->window, tick_callback,
                                   info, NULL);
 
-  our_windows = g_list_prepend (our_windows, info);
+  app->our_windows = g_list_prepend (app->our_windows, info);
 }
 
 static void
-finish_wait_windows (void)
+finish_wait_windows (PerfHelperApp *app)
 {
   GList *l;
 
-  for (l = wait_windows_invocations; l; l = l->next)
+  for (l = app->wait_windows_invocations; l; l = l->next)
     g_dbus_method_invocation_return_value (l->data, NULL);
 
-  g_list_free (wait_windows_invocations);
-  wait_windows_invocations = NULL;
+  g_clear_list (&app->wait_windows_invocations, NULL);
 }
 
 static void
-check_finish_wait_windows (void)
+check_finish_wait_windows (PerfHelperApp *app)
 {
   GList *l;
   gboolean have_pending = FALSE;
 
-  for (l = our_windows; l; l = l->next)
+  for (l = app->our_windows; l; l = l->next)
     {
       WindowInfo *info = l->data;
       if (info->pending)
@@ -269,7 +278,7 @@ check_finish_wait_windows (void)
     }
 
   if (!have_pending)
-    finish_wait_windows ();
+    finish_wait_windows (app);
 }
 
 static void
@@ -282,17 +291,19 @@ handle_method_call (GDBusConnection       *connection,
                    GDBusMethodInvocation *invocation,
                    gpointer               user_data)
 {
+  PerfHelperApp *app = user_data;
+
   /* Push off the idle timeout */
-  establish_timeout ();
+  establish_timeout (app);
 
   if (g_strcmp0 (method_name, "Exit") == 0)
     {
-      destroy_windows ();
+      destroy_windows (app);
 
       g_dbus_method_invocation_return_value (invocation, NULL);
       g_dbus_connection_flush_sync (connection, NULL, NULL);
 
-      gtk_main_quit ();
+      g_application_quit (G_APPLICATION (app));
     }
   else if (g_strcmp0 (method_name, "CreateWindow") == 0)
     {
@@ -303,17 +314,17 @@ handle_method_call (GDBusConnection       *connection,
                      &width, &height,
                      &alpha, &maximized, &redraws, &text_input);
 
-      create_window (width, height, alpha, maximized, redraws, text_input);
+      create_window (app, width, height, alpha, maximized, redraws, text_input);
       g_dbus_method_invocation_return_value (invocation, NULL);
     }
   else if (g_strcmp0 (method_name, "WaitWindows") == 0)
     {
-      wait_windows_invocations = g_list_prepend (wait_windows_invocations, invocation);
-      check_finish_wait_windows ();
+      app->wait_windows_invocations = g_list_prepend (app->wait_windows_invocations, invocation);
+      check_finish_wait_windows (app);
     }
   else if (g_strcmp0 (method_name, "DestroyWindows") == 0)
     {
-      destroy_windows ();
+      destroy_windows (app);
       g_dbus_method_invocation_return_value (invocation, NULL);
     }
 }
@@ -326,68 +337,70 @@ static const GDBusInterfaceVTable interface_vtable =
 };
 
 static void
-on_bus_acquired (GDBusConnection *connection,
-                const gchar     *name,
-                gpointer         user_data)
+perf_helper_app_activate (GApplication *app)
+{
+}
+
+static gboolean
+perf_helper_app_dbus_register (GApplication     *app,
+                               GDBusConnection  *connection,
+                               const char       *object_path,
+                               GError          **error)
 {
   GDBusNodeInfo *introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
 
   g_dbus_connection_register_object (connection,
-                                    "/org/gnome/Shell/PerfHelper",
+                                    object_path,
                                     introspection_data->interfaces[0],
                                     &interface_vtable,
-                                    NULL,  /* user_data */
+                                    app,   /* user_data */
                                     NULL,  /* user_data_free_func */
-                                    NULL); /* GError** */
+                                    error);
+  return TRUE;
 }
 
 static void
-on_name_acquired (GDBusConnection *connection,
-                 const gchar     *name,
-                 gpointer         user_data)
+perf_helper_app_init (PerfHelperApp *app)
 {
 }
 
 static void
-on_name_lost  (GDBusConnection *connection,
-              const gchar     *name,
-              gpointer         user_data)
+perf_helper_app_class_init (PerfHelperAppClass *klass)
 {
-  destroy_windows ();
-  gtk_main_quit ();
+  GApplicationClass *gapp_class = G_APPLICATION_CLASS (klass);
+
+  gapp_class->activate = perf_helper_app_activate;
+  gapp_class->dbus_register = perf_helper_app_dbus_register;
+}
+
+static PerfHelperApp *
+perf_helper_app_new (void) {
+  GApplicationFlags flags = G_APPLICATION_IS_SERVICE |
+                            G_APPLICATION_ALLOW_REPLACEMENT |
+                            G_APPLICATION_REPLACE;
+
+  return g_object_new (PERF_HELPER_TYPE_APP,
+                       "application-id", "org.gnome.Shell.PerfHelper",
+                       "flags", flags,
+                       NULL);
 }
 
 int
 main (int argc, char **argv)
 {
-  GOptionContext *context;
-  GError *error = NULL;
+  PerfHelperApp *app = NULL;
 
   /* Since we depend on this, avoid the possibility of lt-gnome-shell-perf-helper */
   g_set_prgname ("gnome-shell-perf-helper");
 
-  context = g_option_context_new (" - server to create windows for performance testing");
-  g_option_context_add_main_entries (context, opt_entries, NULL);
-  g_option_context_add_group (context, gtk_get_option_group (TRUE));
-  if (!g_option_context_parse (context, &argc, &argv, &error))
-    {
-      g_print ("option parsing failed: %s\n", error->message);
-      return 1;
-    }
-
-  g_bus_own_name (G_BUS_TYPE_SESSION,
-                  BUS_NAME,
-                  G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
-                  G_BUS_NAME_OWNER_FLAGS_REPLACE,
-                  on_bus_acquired,
-                  on_name_acquired,
-                  on_name_lost,
-                  NULL,
-                  NULL);
+  app = perf_helper_app_new ();
 
-  establish_timeout ();
+  g_application_set_option_context_summary (G_APPLICATION (app),
+                                            "Server to create windows for performance testing");
+  g_application_add_main_option_entries (G_APPLICATION (app), opt_entries);
 
-  gtk_main ();
+  g_application_hold (G_APPLICATION (app));
+  establish_timeout (app);
 
-  return 0;
+  return g_application_run (G_APPLICATION (app), argc, argv);
 }